#pragma once

#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>

// 异步写日志的日志的队列
template <class T>
class LockQueue
{
public:
    // 多个worker线程会写日志
    void Push(const T& data)
    {
        std::lock_guard<std::mutex> lock(_mtx);
        _q.push(data);
        _cond.notify_one();
    }

    void Pop(T* data)
    {
        std::unique_lock<std::mutex> lock(_mtx);
        while(_q.empty())
        {
            // 日志队列为空，写日志线程进入wait状态
            _cond.wait(lock);
        }

        *data = _q.front();
        _q.pop();
    }

private:
    std::queue<T> _q;
    std::mutex _mtx;
    std::condition_variable _cond;
};